package com.kehutong.contact.service;

import java.io.File;
import java.util.List;
import java.util.Map;

import org.coraframework.inject.ImplementedBy;
import org.coraframework.json.JSONObject;
import org.coraframework.orm.jdbc.Page;

import com.kehutong.common.util.Token;
import com.kehutong.contact.entity.Resident;
import com.kehutong.contact.entity.ResidentCar;
import com.kehutong.contact.entity.ResidentFamily;
import com.kehutong.contact.entity.ResidentHouse;
import com.kehutong.contact.entity.ResidentHouseBindApply;
import com.kehutong.contact.service.impl.ResidentServiceImpl;
@ImplementedBy(ResidentServiceImpl.class)
public interface ResidentService {
    /**
     * 远程调用测试方法
     * @param p1
     * @param p2
     * @param p3
     * @return
     * @throws Exception
     */
    String executeTestClient(Integer p1,  Map<String,String> p2, Boolean p3) throws Exception;
    /**
     * 根据条件获取住户列表
     * @param jsonObject 查询对象
     * @return 住户列表
     * @throws Exception 操作异常
     */
    Page<Resident> getResidentList(JSONObject jsonObject) throws Exception;


    /***
     * 根据住户标志获取住户信息
     * @param id 住户标志
     * @return 住户对象
     * @throws Exception 操作异常
     */
    Resident getResidentById(String id) throws Exception;


    /**
     * 保存住户
     * @param resident 住户对象
     * @return 住户对象
     * @throws Exception 操作异常
     */
    Resident saveResident(Resident resident) throws Exception;


    /**
     * 更新住户
     * @param resident 住户对象
     * @return 住户对象
     * @throws Exception 操作异常
     */
    Resident updateResident(Resident resident) throws Exception;


    /***
     * 根据住户标志删除住户信息
     * @param id 住户标志
     * @return 操作结果
     * @throws Exception 操作异常
     */
    Boolean deleteResidentById(String id) throws Exception;


    /**
     * 批量保存或更新住户信息
     * @param condition 住户信息相关数据
     * @return 操作结果
     * @throws Exception 操作异常
     */
    Boolean batchSaveOrUpdateResident(JSONObject condition) throws Exception;


    /**
     * 删除住户相关的跟进人信息
     * @param id 住户标志
     * @param userId 用户编号
     * @return 操作结果
     * @throws Exception 操作异常
     */
    Boolean deleteResidentUser(Token token,String id,String userId) throws Exception;


    /**
     * 根据条件获取住户汽车列表
     * @param jsonObject 查询对象
     * @return 住户汽车列表
     * @throws Exception 操作异常
     */
    Page<ResidentCar> getResidentCarList(JSONObject jsonObject) throws Exception;


    /***
     * 根据住户汽车标志获取住户汽车信息
     * @param id 住户汽车标志
     * @return 住户汽车对象
     * @throws Exception 操作异常
     */
    ResidentCar getResidentCarById(String id) throws Exception;


    /**
     * 保存住户汽车
     * @param residentCar 住户汽车对象
     * @return 住户汽车对象
     * @throws Exception 操作异常
     */
    ResidentCar saveResidentCar(ResidentCar residentCar) throws Exception;


    /**
     * 更新住户汽车
     * @param residentCar 住户汽车对象
     * @return 住户汽车对象
     * @throws Exception
     */
    ResidentCar updateResidentCar(ResidentCar residentCar) throws Exception;


    /***
     * 根据住户汽车标志删除住户汽车信息
     * @param id 住户汽车标志
     * @return 操作结果
     * @throws Exception 操作异常
     */
    Boolean deleteResidentCarById(String id) throws Exception;


    /**
     * 根据条件获取住户家庭成员列表
     * @param jsonObject 查询对象
     * @return 住户家庭成员列表
     * @throws Exception 操作异常
     */
    Page<ResidentFamily> getResidentFamilyList(JSONObject jsonObject) throws Exception;


    /***
     * 根据住户家庭成员标志获取住户家庭成员信息
     * @param id 住户家庭成员标志
     * @return 住户家庭成员对象
     * @throws Exception 操作异常
     */
    ResidentFamily getResidentFamilyById(String id) throws Exception;


    /**
     * 保存住户家庭成员
     * @param residentFamily 住户家庭成员对象
     * @return  住户家庭成员对象
     * @throws Exception 操作异常
     */
    ResidentFamily saveResidentFamily(ResidentFamily residentFamily) throws Exception;


    /**
     * 更新住户家庭成员
     * @param residentFamily 住户家庭成员对象
     * @return 住户家庭成员对象
     * @throws Exception 操作异常
     */
    ResidentFamily updateResidentFamily(ResidentFamily residentFamily) throws Exception;


    /***
     * 根据住户家庭成员标志删除住户家庭成员信息
     * @param id 住户家庭成员标志
     * @return 操作结果
     */
    Boolean deleteResidentFamilyById(String id) throws Exception;


    /**
     * 根据条件获取住户房屋列表
     * @param jsonObject 查询对象
     * @return 住户房屋列表
     * @throws Exception 操作异常
     */
    Page<ResidentHouse> getResidentHouseList(JSONObject jsonObject) throws Exception;


    /***
     * 根据住户房屋标志获取住户房屋信息
     * @param id 住户房屋标志
     * @return 住户房屋对象
     * @throws Exception 操作异常
     */
    ResidentHouse getResidentHouseById(String id) throws Exception;


    /**
     * 根据条件获取一条住户房屋信息
     * @param houseNo 房屋编号
     * @return 住户房屋信息
     * @throws Exception 异常
     */
    ResidentHouse getOwnerHouse(String houseNo) throws Exception;

    /**
     * 保存住户房屋
     * @param residentHouse 住户房屋对象
     * @return 新增条数
     * @throws Exception 住户房屋对象
     */
    ResidentHouse saveResidentHouse(ResidentHouse residentHouse) throws Exception;



    /**
     * 绑定房屋
     * 前段微信会员认证房屋申请审核通过会触发该结果
     * 如果绑定房屋的手机号住户信息存在就更新,否者新增住户信息
     * 住户房屋绑定信息存在就更新否者就新增
     * 保证冥等性,调用多次结果不变
     *
     * @param residentHouse 住户房屋对象
     * @return 住户对象
     * @throws Exception 操作异常
     */
    public Resident bindResidentHouse(ResidentHouse residentHouse,JSONObject jsonObject) throws Exception;


    /**
     * 绑定房屋
     * 前段微信会员认证房屋申请审核通过会触发该结果
     * 如果绑定房屋的手机号住户信息存在就更新,否者新增住户信息
     * 住户房屋绑定信息存在就更新否者就新增
     * 保证冥等性,调用多次结果不变
     *
     * @param residentHouseBindApply 住户房屋绑定申请对象
     * @return 住户对象
     * @throws Exception 操作异常
     */
    public Resident bindResidentHouse(ResidentHouseBindApply residentHouseBindApply) throws Exception;

    /**
     * 更新住户房屋
     * @param residentHouse 住户房屋对象
     * @return 住户房屋对象
     * @throws Exception 操作异常
     */
    ResidentHouse updateResidentHouse(ResidentHouse residentHouse) throws Exception;


    /**
     * 接触住户绑定房屋
     * @param residentNo 住户编号
     * @param houseNo 房屋编号
     * @return 住户房屋对象
     * @throws Exception
     */
    Object unbindResidentHouse(String residentNo,String houseNo) throws Exception;


    /***
     * 根据住户房屋标志删除住户房屋信息
     * @param id 住户房屋标志
     * @return 操作结果
     * @throws Exception 操作异常
     */
    Boolean deleteResidentHouseById(String id) throws Exception;


    /***
     * 根据条件删除住户房屋信息
     * 1.业主列表删除
     * 2.亲属列表删除
     * 3.租户列表删除
     * @param jsonObject 删除哦啊见
     * @return 操作结果
     * @throws Exception 操作异常
     */
    Boolean deleteResidentHouse(JSONObject jsonObject) throws Exception;


    /***
     * 根据条件批量删除住户房屋信息
     * 1.业主列表删除
     * 2.亲属列表删除
     * 3.租户列表删除
     * @param jsonObject 删除哦啊见
     * @return 操作结果
     * @throws Exception 操作异常
     */
    Boolean batchDeleteResidentHouse(JSONObject jsonObject) throws Exception;


    /**
     * 导出住户数据文件
     * @param residentList  住户数据集合
     * @return 文件对象
     * @throws Exception
     */
    File exportResidentDataFile(List<Resident> residentList) throws Exception;

    /**
     * 批量新增业主信息
     * @param condition 条件
     * @throws Exception 异常
     */
    Object batchSaveOrUpdateOwner(Token token,JSONObject condition) throws Exception;


    /**
     * 批量新增租客或家属信息
     * @param condition 条件
     * @throws Exception 异常
     */
    Object batchSaveOrUpdateNoOwner(Token token, JSONObject condition) throws Exception;


    /**
     * 新增或变更房屋业主信息
     * @param resident 住户对象
     * @return 结果
     * @throws Exception 异常
     */
    Object saveOrUpdateHouseOwner(Resident resident) throws Exception;

    /**
     * 根据房屋ids获取房屋下的住户
     * @return
     * @throws Exception
     */
    List<ResidentHouse>getUserListByHouseIds(JSONObject jsonObject) throws Exception;

}
